// vite-plugin-page-mate.js
import LoaderUtils from "./utils/readJson";
import fs from "fs";

let defaultInsertContent = '<page-meta v-bind="$getPageMetaConfig()"></page-meta>';

// #ifdef MP_WEIXIN
// 小程序非自定义组件暂不支持 v-bind ，需要解开取去赋值
defaultInsertContent = `
<page-meta 
  :root-font-size="$getPageMetaConfig()['root-font-size']"
  :page-font-size="$getPageMetaConfig()['page-font-size']"
  ></page-meta>
`;
// #endif
// 全局颜色 :page-style="$getPageMetaConfig()['page-style']"

/**
 * 插入<page-meta> 元素到页面的模板中</page-meta>函数体
 *
 * @param {*} options
 *   insertContent: '<page-meta :root-font-size="10"></page-meta>', // 插入的内容
 *   files: [.....], // 需要插入的文件列表 (不填或为空默认去读 /src/pages.json 的主包和分包文件)
 *   exclude: [path.resolve(process.cwd(), `src/subSetting/fontSetting/fontSetting.vue`) ] // 不处理的文件 (src/ 注意处理目录是项目根目录)
 * @returns
 */
export default function pageMatePlugin(options = {}) {
  console.log(
    ["vite-plugin-page-mate"],
    "running... \n <page-mate> 将会插入当前页面的头节点，多少会影响vite的构建速度，建议不需要测试字体变化的情况下禁用此插件"
  );
  const { insertContent = defaultInsertContent, files, exclude = [] } = options;
  const includes = LoaderUtils.getPagesJSonFiles();
  let count = 0;

  return {
    name: "vite-plugin-page-mate", // 必须有一个唯一的字符串作为插件名
    async load(id) {
      // 检查是否应该处理此文件
      if (!includes.includes(id) || exclude.includes(id)) {
        return null; // 不处理
      }

      // 读取文件原始内容
      // const filePath = path.resolve(id);
      const code = fs.readFileSync(id, "utf-8");

      // 检查是否已经包含 <page-mate>
      if (/<page-mate/.test(code)) {
        count++;
        return null; // 已经包含，无需处理
      }

      // 插入 <page-mate> 元素
      const findText = "<template>";
      const templateEndIndex = code.indexOf(findText) + findText.length;
      const updatedCode = `${code.slice(0, templateEndIndex)}${insertContent}${code.slice(templateEndIndex)}`;
      count++;
      // console.log(` > page-mate-loader 插入路由页面 ${id}`, '(', count, '/', includes.length, ')');
      // console.log('updatedCode', code);

      return {
        code: updatedCode,
        map: null, // 如果有 sourcemap 需求，可以在这里提供
      };
    },
  };
}
